package com.hitqz.robot.driver.parent;

import com.hitqz.robot.api.business.enums.FormConfigEnum;
import com.hitqz.robot.api.business.enums.RobotDriverEnum;
import com.hitqz.robot.api.business.enums.RobotOtherCommandEnum;
import com.hitqz.robot.api.business.enums.RobotParamsFormFieldEnum;
import com.hitqz.robot.api.common.dto.form.FormConfigDto;
import com.hitqz.robot.api.common.dto.form.FormFieldConfigDto;
import com.hitqz.robot.api.common.dto.robot.InitPosDto;
import com.hitqz.robot.api.common.dto.robot.RobotGoTargetPosDto;
import com.hitqz.robot.api.common.dto.robot.RobotMoveDto;
import com.hitqz.robot.api.common.entity.Robot;
import com.hitqz.robot.api.common.entity.RobotMap;
import com.hitqz.robot.api.common.entity.RobotMapPos;
import com.hitqz.robot.common.core.util.R;
import com.hitqz.robot.driver.dto.robot.RobotCustomInfo;
import com.hitqz.robot.driver.model.IRobotPosDto;
import com.hitqz.robot.driver.model.MapAttributesDto;
import com.hitqz.robot.driver.model.PointDto;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xupkun
 * @date 2023/7/31
 */
public interface RobotDriverService {

    /**
     * 上线后执行
     * @return
     */
    boolean doOnlineMode(Robot robot);

    /**
     * 设置机器人运动
     * @return
     */
    boolean setSpeed(RobotMoveDto baseSpeedDto);

    boolean changeWebControlSpeed(float changeValue);


    /**
     * 设置机器人初始位置
     * @param baseInitPosDto
     * @return
     */
    boolean setInitPos(InitPosDto baseInitPosDto);


    /**
     * 机器人前往目标点
     * @return
     */
    boolean robotTaskGoTarget(RobotGoTargetPosDto dto);

    /**
     * 中断机器人的操作
     * @return
     */
    boolean motionAbort();

    /**
     * 导航命令 1--暂停 2-继续 3-取消
     * @param cmd
     * @return
     */
    boolean navCmd(Integer cmd);


    /**
     * 充电命令
     * @param cmd 0--停止充电 1-充电
     * @return
     */
     default boolean cmdCharge(Integer cmd){
         return true;
     }

    /**
     * 执行命令
     * @param cmdEnum 命令枚举类
     * @return
     */
    R executeOtherCommand(RobotOtherCommandEnum cmdEnum,String jsonParams);

    /**
     * 获取web点位信息
     * @return
     */
    IRobotPosDto getWebPos();


    /**
     * 查询起点-终点路径
     * @param sourcePos
     * @param targetPos
     * @param allRobotMapPos
     * @return
     */

    List<RobotMapPos> getNavPath(RobotMapPos sourcePos, RobotMapPos targetPos, List<RobotMapPos> allRobotMapPos);


    /**
     * 从机器人上面读取点位信息
     * 仙工-底盘有， 其他目前没有
     * @return
     */

    List<RobotMapPos> getRobotMapPos(String mapCode);


    /**
     * 底盘都有
     * @return
     */

    List<RobotMap> getMapList();

    /**
     * 获取当前加载的地图
     * @return
     */
    String getCurrentMap();

    /**
     * 获取制定地图的参数
     * @param mapCode
     * @return
     */
    MapAttributesDto getMapAttributes(String mapCode);


    /**
     * 选择要加载的地图
     * @param map
     */
    void selMap(RobotMap map);


    /**
     * 将画布上面计算转化成机器人坐标
     * @param pointDto
     * @return
     */
    PointDto canvas2Point(RobotMap robotMap,PointDto pointDto);

    default PointDto point2Canvas(RobotMap robotMap,PointDto pointDto){
        return null;
    }


    default List<RobotCustomInfo> getCustomInfo() {
        return null;
    }


    default FormConfigDto getRobotConfig(String formName){
        // 创建字段配置
        ArrayList<FormFieldConfigDto> fields = new ArrayList<>();
        fields.add(RobotParamsFormFieldEnum.ULTRASONIC_ENABLE.toConfigDto());
        fields.add(RobotParamsFormFieldEnum.COLLISION_AVOIDANCE_ENABLED.toConfigDto());
        fields.add(RobotParamsFormFieldEnum.ROBOT_SPEED.toConfigDto());
        // 通过 FormConfigEnum 创建表单配置
        return FormConfigEnum.ROBOT_PARAMS_CONFIG.toFormConfigDto(fields);
    }


    default RobotDriverEnum getDriverVersion(){
        return RobotDriverEnum.NONE;
    }


}
